{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-a34a30334354>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.one_hot on tensors.\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/contrib/layers/python/layers/layers.py:1624: flatten (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use keras.layers.flatten instead.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-11-413a88f1eb86>:3: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-12-3c77ec77605a>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.372637, the validation accuracy is 0.9314\n",
      "after 200 training steps, the loss is 0.0914539, the validation accuracy is 0.961\n",
      "after 300 training steps, the loss is 0.203833, the validation accuracy is 0.9686\n",
      "after 400 training steps, the loss is 0.118822, the validation accuracy is 0.9702\n",
      "after 500 training steps, the loss is 0.188961, the validation accuracy is 0.9562\n",
      "after 600 training steps, the loss is 0.0644137, the validation accuracy is 0.978\n",
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/python/training/saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.110714, the validation accuracy is 0.978\n",
      "after 800 training steps, the loss is 0.119517, the validation accuracy is 0.9734\n",
      "after 900 training steps, the loss is 0.107801, the validation accuracy is 0.981\n",
      "after 1000 training steps, the loss is 0.0443182, the validation accuracy is 0.9796\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9848\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/surfman/.local/lib/python3.6/site-packages/tensorflow/python/training/saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
